﻿#region Copyright Notice
// This file is part of GestionPedago.
// <description>
// Copyright (C) 2012 ENI Ecole Informatique
// 
// GestionPedago is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// <program> is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
#endregion

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GestionPedago.Services.ES.Modele;
using System.Collections.ObjectModel;
using GestionPedago.Services;
using GestionPedago.Services.ES;
using System.Windows.Input;

namespace GestionPedago.ViewModel
{
    /// <summary>
    /// Onglet de liste des évènements pédagogiques
    /// </summary>
    public class EvenementsPedagogiquesVM : OngletVM
    {
        /// <summary>
        /// Constructeur
        /// </summary>
        /// <param name="parent">Le gestionnaire d'onglets</param>
        public EvenementsPedagogiquesVM(GestionnaireOngletsVM parent)
        {
            base.DisplayName = "Evènements pédagogiques";
            base.Parent = parent;
        }

        private ICommand creaModEvenementPedagogiqueCommand;
        private ObservableCollection<EvenementPedagogiqueES> pListeEvenementsPedagogique;
        private ObservableCollection<ContactENIES> pListeResponsables;
        private ObservableCollection<int> pListeIntervenantsCoches;

        public ICommand CreaModEvenementPedagogiqueCommand
        {
            get
            {
                if (creaModEvenementPedagogiqueCommand == null)
                {
                    creaModEvenementPedagogiqueCommand = new RelayCommand(param => this.openCreaModEvenementPedagogique());
                }
                return creaModEvenementPedagogiqueCommand;
            }
        }

        /// <summary>
        /// Méthode d'ouverture d'un onglet de création/modification d'évènement pédagogique
        /// </summary>
        private void openCreaModEvenementPedagogique()
        {
            CreaModEvenementPedagogiqueVM vmCreaModEvenementPedagogique = new CreaModEvenementPedagogiqueVM(base.Parent);
            base.Parent.Onglets.Add(vmCreaModEvenementPedagogique);
            base.Parent.SelectedOnglet = vmCreaModEvenementPedagogique;
        }

        public ObservableCollection<int> ListeIntervenantsCoches 
        {
            get
            {
                return pListeIntervenantsCoches;
            }
            set
            {
                pListeIntervenantsCoches = value;
                RaisePropertyChanged("ListeIntervenantsCoches");
                UpdateListeEvenements();
            }
        }
        private DateTime? pCreeDepuis;
        private bool domaineTous;
        private bool domaineAdmin;
        private bool domaineEntrep;
        private bool domainePedag;
        private bool domaineInterDir;
        private bool domaineInterAdmin;
        private bool domaineInterEntrep;
        private bool domaineInterPedag;
        private bool updated = false;
        public bool DomaineTous
        {
            get
            {
                return domaineTous;
            }
            set
            {
                domaineTous = value;
                RaisePropertyChanged("DomaineTous");
                UpdateListeEvenements();
                updated = true;
                DomaineAdmin = value;
                DomaineEntrep = value;
                DomainePedag = value;
                updated = false;
            }
        }
        public bool DomaineAdmin
        {
            get
            {
                return domaineAdmin;
            }
            set
            {
                domaineAdmin = value;
                RaisePropertyChanged("DomaineAdmin");
                UpdateListeEvenements();
            }
        }
        public bool DomaineEntrep
        {
            get
            {
                return domaineEntrep;
            }
            set
            {
                domaineEntrep = value;
                RaisePropertyChanged("DomaineEntrep");
                UpdateListeEvenements();
            }
        }
        public bool DomainePedag
        {
            get
            {
                return domainePedag;
            }
            set
            {
                domainePedag = value;
                RaisePropertyChanged("DomainePedag");
                UpdateListeEvenements();
            }
        }

        public bool DomaineInterAdmin
        {
            get
            {
                return domaineInterAdmin;
            }
            set
            {
                domaineInterAdmin = value;
                RaisePropertyChanged("DomaineInterAdmin");
                UpdateListeIntervenants();
            }
        }
        public bool DomaineInterEntrep
        {
            get
            {
                return domaineInterEntrep;
            }
            set
            {
                domaineInterEntrep = value;
                RaisePropertyChanged("DomaineInterEntrep");
                UpdateListeIntervenants();
            }
        }
        public bool DomaineInterPedag
        {
            get
            {
                return domaineInterPedag;
            }
            set
            {
                domaineInterPedag = value;
                RaisePropertyChanged("DomaineInterPedag");
                UpdateListeIntervenants();
            }
        }
        public bool DomaineInterDir
        {
            get
            {
                return domaineInterDir;
            }
            set
            {
                domaineInterDir = value;
                RaisePropertyChanged("DomaineInterDir");
                UpdateListeIntervenants();
            }
        }

        public ObservableCollection<EvenementPedagogiqueES> ListeEvenementsPedagogique
        {
            get
            {
                if (pListeEvenementsPedagogique == null)
                {
                    UpdateListeEvenements();
                }
                return pListeEvenementsPedagogique;
            }
            set
            {
                pListeEvenementsPedagogique = value;
                RaisePropertyChanged("ListeEvenementsPedagogique");
            }
        }

        public ObservableCollection<ContactENIES> ListeResponsables
        {
            get
            {
                if (pListeResponsables == null)
                {
                    pListeResponsables = new ObservableCollection<ContactENIES>(AppelerServiceRechercherListeIntervenants());
                }
                return pListeResponsables;
            }

            set
            {
                pListeResponsables = value;
                RaisePropertyChanged("ListeResponsables");
            }
        }

        public DateTime? CreeDepuis
        {
            get
            {
                return pCreeDepuis;
            }

            set
            {
                pCreeDepuis = value;
                RaisePropertyChanged("CreeDepuis");
                UpdateListeEvenements();
            }
        }

        /// <summary>
        /// Méthode d'appel au service de recherche des intervenants
        /// </summary>
        /// <returns>La liste des intervenants</returns>
        private List<ContactENIES> AppelerServiceRechercherListeIntervenants()
        {
            RechercherListeIntervenantsIn paramEntree = new RechercherListeIntervenantsIn();
            List<string> listeDomainesCoches = new List<string>();
            if (domaineInterEntrep)
            {
                listeDomainesCoches.Add("ENTREP");
            }
            if (domaineInterAdmin)
            {
                listeDomainesCoches.Add("ADMIN");
            }
            if (domaineInterPedag)
            {
                listeDomainesCoches.Add("PEDA");
            }
            if (domaineInterDir)
            {
                listeDomainesCoches.Add("DIREC");
            }
            paramEntree.ListeDomainesActivite = listeDomainesCoches;
            RechercherListeIntervenantsOut paramSortie = FacadeServices.GetInstance().RechercherListeIntervenants(paramEntree);
            return paramSortie.ListeIntervenants;
        }

        /// <summary>
        /// Méthode de mise à jour de la liste des intervenants
        /// </summary>
        public void UpdateListeIntervenants()
        {
            this.ListeResponsables = new ObservableCollection<ContactENIES>(AppelerServiceRechercherListeIntervenants());
        }

        /// <summary>
        /// Méthode d'appel au service de recherche des évènements et mise à jour de la liste
        /// </summary>
        public void UpdateListeEvenements()
        {
            if (!updated)
            {
                RechercherListeEvtPedagogiquesIn paramEntree = new RechercherListeEvtPedagogiquesIn();
                paramEntree.DateEcheance = pCreeDepuis;
                List<string> listeDomainesCoches = new List<string>();
                if (domaineEntrep)
                {
                    listeDomainesCoches.Add("ETS");
                }
                if (domaineAdmin)
                {
                    listeDomainesCoches.Add("ADM");
                }
                if (domainePedag)
                {
                    listeDomainesCoches.Add("PEDAGOGIE");
                }
                paramEntree.ListeDomainesActivite = listeDomainesCoches;
                if (pListeIntervenantsCoches != null)
                {
                    paramEntree.ListeIntervenants = new List<int>(pListeIntervenantsCoches);
                }
                if (this.Parent.vmMainWindow.CurrentStagiaire.CodeStagiaire != 0)
                {
                    paramEntree.CodeStagiaire = this.Parent.vmMainWindow.CurrentStagiaire.CodeStagiaire;
                }
                RechercherListeEvtPedagogiquesOut paramSortie = FacadeServices.GetInstance().RechercherListeEvtPedagogiques(paramEntree);
                ListeEvenementsPedagogique = new ObservableCollection<EvenementPedagogiqueES>(paramSortie.ListeEvenements);
            }
        }

        /// <summary>
        /// Propriété pour l'activation/désactivation du bouton de créaiton d'évènement
        /// </summary>
        public bool ActiverBoutonCrea {
            get
            {
                return this.Parent.vmMainWindow.CurrentStagiaire.CodeStagiaire != 0;
            }
        }
    }
}
